package com.class04.config;

import com.github.pagehelper.PageInterceptor;
import org.apache.ibatis.logging.slf4j.Slf4jImpl;
import org.apache.ibatis.session.AutoMappingBehavior;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.mapper.MapperScannerConfigurer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.sql.DataSource;
import java.util.Properties;

/**
 * @ClassDescription:
 * 持久层配置类：连接池，sqlSessionFactory，mapper代理对象
 * 方式2：不保留外部配置文件，全部mybatis的属性都在代码中设置！
 * @JdkVersion: 17
 * @Author: yxy
 * @Created: 2023/12/21 18:38
 */
@Configuration
public class MapperJavaConfigNEW {
    @Bean
    public SqlSessionFactoryBean sessionFactoryBean(DataSource source){
        SqlSessionFactoryBean sqlSessionFactoryBean =
                new SqlSessionFactoryBean();
//        指定配置文件等信息
//        指定数据库连接池对象
        sqlSessionFactoryBean.setDataSource(source);
//        指定mybatis配置文件的功能，使用代码的形式
        org.apache.ibatis.session.Configuration configuration =
                new org.apache.ibatis.session.Configuration();
        configuration.setMapUnderscoreToCamelCase(true);
        configuration.setLogImpl(Slf4jImpl.class);
        configuration.setAutoMappingBehavior(AutoMappingBehavior.FULL);
//        org.apache.ibatis.session.Configuration//存储setting的配置文件
        sqlSessionFactoryBean.setConfiguration(configuration);
//        别名设置
//        sqlSessionFactoryBean.setTypeAliases();
        sqlSessionFactoryBean.setTypeAliasesPackage("com.class04.pojo");
        PageInterceptor pageInterceptor = new PageInterceptor();
        Properties properties = new Properties();
        properties.setProperty("helperDialect","mysql");
        pageInterceptor.setProperties(properties);
        sqlSessionFactoryBean.addPlugins(pageInterceptor);
        return sqlSessionFactoryBean;
    }

    //mapper代理对象加入ioc

    /**
     * 当您在代码中使用@Bean注解时，您正在定义一个Spring Bean。
     * 这个特定的@Bean方法创建并返回一个MapperScannerConfigurer对象。
     * MapperScannerConfigurer是MyBatis的配置类，用于自动扫描和创建映射器接口(Mapper)的实例。
     * 在这个方法中，我们首先创建了一个MapperScannerConfigurer对象。
     * 然后，我们使用setBasePackage方法来指定要扫描的包路径，以便找到所有的映射器接口。
     * 在这个例子中，包路径是com.class04.mapper。最后，我们返回创建的MapperScannerConfigurer对象。
     * 通过将这个方法定义为@Bean，我们告诉Spring框架，每次需要一个MapperScannerConfigurer对象时，
     * 应该调用这个方法来创建一个新的实例。这允许我们在应用程序中灵活地使用多个MapperScannerConfigurer对象，
     * 如果需要的话。
     * @return
     */
    @Bean
    public MapperScannerConfigurer mapperScannerConfigurer(){
//        mapper代理对应的factoryBean->指定一个包->mapper接口
//        ->sqlSessionFactory->sqlSession->getMapper->mapper代理对象 ->ioc
        MapperScannerConfigurer mapperScannerConfigurer =
                new MapperScannerConfigurer();
        //mapper接口和mapper.xml编译之后所在共同包
        mapperScannerConfigurer.setBasePackage("com.class04.mapper");
        return mapperScannerConfigurer;
    }




}
